<?php

/**
 * iphp核心类
 */
class i
{
    public static $_xsrf=null;
    public static $outhtml='';
    protected function __construct($pars=[])
    {
        spl_autoload_register("i::iloader");//注册自动类库的方法。
    }

    /**
     * 禁止克隆
     */
    public function __clone(){
        exit("clone is not allowed[2013101185938]" . E_USER_ERROR);
    }

    /**
     * 类自动调用
     * @param $class_name
     */
    public static function iloader($class_name)
    {
        $class_name=strtr($class_name,"\\","//");
        $file_path=D."/app/".$class_name.'.php';
        is_file($file_path) or self::nofile($class_name);
        require($file_path);
    }

    /**
     * 框架运行方法，
     */
    public static function run()
    {
        (isset($_GET['_c']) and trim($_GET['_c'])!='') or $_GET['_c']="index";
        (isset($_GET['_m']) and trim($_GET['_m'])!='') or $_GET['_m']="index";
        $_GET["_c"]=strtr($_GET['_c'],['\\'=>'','/'=>'','.'=>'']);
        $_GET["_m"]=strtr($_GET['_m'],['\\'=>'','/'=>'','.'=>'']);
        $file_path=D."/app/c/".$_GET["_c"].".php";
        is_file($file_path) or self::nofile($_GET['_c']);
        require($file_path);
        $c="\\c\\".$_GET["_c"];
        $m=$_GET['_m'];
        $o=new $c();
        $o->$m();
    }

    /**
     * 命令行模式运行框架
     * @param string $_c
     * @param string $_m
     * @param array $argv
     */
    public static function runcmd($_c='',$_m='',$argv=[])
    {
        $_c or $_c="index";
        $_m or $_m="index";
        $file_path=D."/app/c/".$_c.".php";
        is_file($file_path) or self::nofile($_c);
        require($file_path);
        $c="\\c\\".$_c;
        $m=$_m;
        $o=new $c();
        $o->$m($argv);

    }

    /**
     * 模板输出
     * @param array $_vn
     * @param array $_vd
     * @param bool $r
     * @return string
     */
    public static function v($_vn=[],$_vd=[],$r=false){
        ob_start();
        extract($_vd);
        self::setxsrf();
        $_xsrf=self::$_xsrf;//开启xsrf;
        $_xsrfh="<input type=\"hidden\" name=\"_xsrf\" value=\"".$_xsrf."\" />";
        foreach($_vn as $k=>$v){
            $file_path=D."/app/v/".$v.".php";
            if(!is_file($file_path))
            {
                continue;//如果不存在文件就跳过
            }
            require($file_path);
        }
        $ret=ob_get_clean();
        self::$outhtml=$ret;
        if($r)
        {
            return $ret;
        }else{
            echo $ret;
        }
    }

    /**
     * 调用不存在的方法，报错。
     * @param $func_name
     * @param $argument
     */
    public function __call($func_name,$argument)
    {
        self::fzf();
    }

    /**
     * 未找到文件处理
     * @param string $filename
     */
    public static function nofile($filename='')
    {
        exit('nofile'.$filename);
    }

    /**
     * four zero four 报404错误。
     */
    public static function fzf($str='')
    {
        header("Status: 404 Not Found");
        $str and print($str);
        exit();
    }

    /**
     * 301 跳转
     * @param string $to
     */
    public static function r($to="")
    {
//        header("HTTP/1.1 301 Moved Permanently");
        header('Location:' . $to,true,301);
        exit();
    }

    /**
     * 构建伪静态链接，需要服务器配合
     * @param $_c 请求的控制器
     * @param $_m 请求控制器中的方法
     * @param array $pars 需要在url中传递的参数
     * @param bool $r 是否返回url还是直接输出url 默认返回构造好的url
     * @return string 返回url
     */
    public static function rwa($_c,$_m,$pars=[],$r=true)
    {
        $tmp='';
        foreach($pars as $k=>$v)
        {
            $tmp.='-'.$k.'-'.$v;
        }
        $url="http://".WEB_ADS."/--".$_c."-".$_m.$tmp.'.html';
        if($r)
        {
            return $url;
        }else{
            echo $url;
        }
    }

    /**
     * 构造链接
     * @param $_c 请求的控制器
     * @param $_m 请求控制器中的方法
     * @param array $pars 需要在url中传递的参数
     * @param bool $r 是否返回还是直接输出构造好的url 默认返回构造好的url
     * @return string 返回url
     */
    public static function a($_c,$_m,$pars=[],$r=true){
        $tmp="";
        foreach($pars as $k=>$v){
            if($k!="#")
            {
                $tmp.=$k."=".$v."&";
            }
        }
        $tmp=trim($tmp,'&');
        isset($pars['#']) and $tmp.="#".$pars['#'];
        $url="http://".WEB_ADS."/?_c=".$_c."&_m=".$_m."&".$tmp;
        $url=trim($url,'&');
        if($r)
        {
            return $url;
        }else{
            echo $url;
        }
    }
    /**
     * 加载conf.php中的配置
     * @param $group 配置分组
     * @param string $item 分组中的配置名
     * @return mixed
     */
    public static function commconf($group,$item=""){
        $filename=D.'/core/conf.php';
        WEB_ADS=='localhost' and $filename=D.'/core/testconf.php';
        $_conf=require($filename);
        $tmp='';
        if($item)
        {
            isset($_conf[$group][$item]) and $tmp=$_conf[$group][$item];
        }else{
            isset($_conf[$group]) and $tmp=$_conf[$group];
        }
        return $tmp;
    }
    /**
     * 加载app/conf配置
     * @param $file
     * @return array
     */
    public static function appconf($file){
        $ret=[];
        $filename=D."/app/conf/$file.php";
        if(is_file($filename))
        {
            return require($filename);
        }else{
            return $ret;
        }
    }

    /**
     * 设置xsrf码
     */
    public static function setxsrf(){
        isset($_COOKIE['_xsrf']) or self::$_xsrf=self::sign();
        isset($_COOKIE['_xsrf']) and self::$_xsrf=$_COOKIE['_xsrf'];
        isset($_COOKIE['_xsrf']) or setcookie("_xsrf",self::$_xsrf,null,null,null,null,true);
    }

    /**
     * 获取当前的xsrf码
     * @return null
     */
    public static function getxsrf()
    {
        self::$_xsrf or self::$_xsrf=&$_COOKIE['_xsrf'];
        return self::$_xsrf;
    }

    /**
     * 自动验证xsrf。
     * @param bool $ret 设置是否返回验证结果，默认不返回验证结果而是直接报404错误。
     * @param string $form_xsrf 给入特定的xsrf验证
     * @return bool 当$ret=true时返回验证结果
     */
    public static function chkxsrf($ret=false,$form_xsrf=''){
        $form_xsrf or $form_xsrf=&$_POST['_xsrf'];
        $cookie_xsrf=$_COOKIE['_xsrf'];
        $ret or ($form_xsrf==$cookie_xsrf or self::fzf());
        return $form_xsrf==$cookie_xsrf;
    }

    /**
     * 生成唯一编码
     * @return string
     */
    public static function sign(){
        return sha1(uniqid('iphp',true));
    }

    /**
     * 加载第三方类
     * @param $file
     */
    public static function pluslib($file)
    {
        $file=D.'/plus/'.$file.'.php';
        is_file($file) and require($file);

    }

}